package Cuenta;

import ComandoCuenta.ComandoConsultarCuentaPorFecha;
import ComandoCuenta.ComandoConsultarCuentaPorMes;
import ComandoCuenta.ComandoInformacioCuenta;
import ComandoCuenta.ComandoIngresarNuevaCuentaMismoBanco;
import ComandoCuenta.ComandoIngresarNuevaCuentaOtroBanco;
import ComandoCuenta.ComandoObtenerCuentasPropias;
import ComandoCuenta.ComandoObtenerListaCuentaCorrientePropia;
import ComandoCuenta.ComandoObtenerListaCuentaOtroBanco;
import ComandoCuenta.ComandoObtenerListaCuentaTercero;
import Dominio.Cuenta;
import Dominio.Movimiento;
import Dominio.Parametro;
import Dominio.Usuario;
import DominioWS.CuentaWS;
import DominioWS.MovimientoWS;
import DominioWS.ParametroWS;
import DominioWS.UsuarioWS;
import Excepciones.ACMSoapExcepcion;
import Excepciones.FabricaExcepcionesSoap;
import FabricaComando.FabricaComandoCuenta;
import Traductor.Traductor;

public class ModuloCuenta implements IModuloCuenta{
	
	/**
	 * Metodo que se encarga de obtener la cuenta corriente propia del cliente
	 * @param usuario
	 * @return
	 * @throws ACMSoapExcepcion
	 */
	public CuentaWS[] obtenerListaCuentaCorrientePropiaWS(UsuarioWS parametro) 
		throws ACMSoapExcepcion{
		CuentaWS[] listaCuenta = null;
		try{			
			Usuario usuario = Traductor.traductorUsuario(parametro);
			ComandoObtenerListaCuentaCorrientePropia comando = 
				FabricaComandoCuenta.crearComandoObtenerListaCuentaCorrientePropia(usuario);
			Cuenta[] resultado = comando.ejecutar();
			listaCuenta = Traductor.traductorListaCuenta(resultado);
			
		}catch(Exception e){
			throw new FabricaExcepcionesSoap().obtenerExcepcionSoap
			("Error inesperado", e);
		}
		return listaCuenta;
	}
	/**
	 * Metodo que se encarga de obtener una lista de toda las cuentas propias del cliente
	 * @param usuario
	 * @return lista de cuentas propias
	 * @throws ACMSoapExcepcion
	 */
	public CuentaWS[] obtenerCuentasPropiasWS(UsuarioWS parametro)
	throws ACMSoapExcepcion{
		CuentaWS[] listaCuenta = null;
		try{			
			Usuario usuario = Traductor.traductorUsuario(parametro);
			ComandoObtenerCuentasPropias comando = 
				FabricaComandoCuenta.crearComandoObtenerCuentasPropias(usuario);
			Cuenta[] resultado = comando.ejecutar();
			listaCuenta = Traductor.traductorListaCuenta(resultado);
			
		}catch(Exception e){
			throw new FabricaExcepcionesSoap().obtenerExcepcionSoap("Error inesperado", e);
		}
		return listaCuenta;
	}
	
	/**
	 * Metodo que se encarga de obtener una lista de toda las cuentas
	 *  de otros banco que tiene asociado el usuario
	 * @param usuario
	 * @return
	 * @throws ACMSoapExcepcion
	 */
	public CuentaWS[] obtenerListaCuentaOtroBancoWS( UsuarioWS parametro ) 
	throws ACMSoapExcepcion{
		CuentaWS[] listaCuenta = null;
		try{			
			Usuario usuario = Traductor.traductorUsuario(parametro);
			ComandoObtenerListaCuentaOtroBanco comando = 
				FabricaComandoCuenta.crearComandoObtenerListaCuentaOtroBanco(usuario);
			Cuenta[] resultado = comando.ejecutar();			
			listaCuenta = Traductor.traductorListaCuenta(resultado);
			
		}catch(Exception e){
			throw new FabricaExcepcionesSoap().obtenerExcepcionSoap("Error inesperado", e);
		}
		return listaCuenta;
	}
	
	/**
	  * Meotodo que se encarga de obtener una lista de todas las cuentas terceros de un cliente
	 * de otro banco para poder acceder tenemos el id del cliente que estara en el singleton
	 * @param usuario
	 * @return
	 * @throws ACMSoapExcepcion
	 */
	public CuentaWS[] obtenerListaCuentaTerceroWS( UsuarioWS parametro ) 
	throws ACMSoapExcepcion{
		CuentaWS[] listaCuenta =null;
		try{
			/*BancoWS banco = new BancoWS();
			banco.set_nombre("Mercantil");
			
			CuentaWS _cuenta1 = new CuentaWS();
			_cuenta1.set_id(1);
			_cuenta1.set_alias("Alias Ahorro-Tercero");
			_cuenta1.set_numero("06182038426543");
			_cuenta1.set_montoDisponible("13000");
			_cuenta1.set_banco(banco);
				
			CuentaWS _cuenta2 = new CuentaWS();
			_cuenta2.set_id(2);
			_cuenta2.set_alias("Alias Corriente-Tercero");
			_cuenta2.set_numero("48905466546546");
			_cuenta2.set_montoDisponible("19000");
			_cuenta2.set_banco(banco);
			
			listaCuenta[0] = _cuenta1;
			listaCuenta[1] = _cuenta2;*/
			Usuario usuario = Traductor.traductorUsuario(parametro);
			ComandoObtenerListaCuentaTercero comando = 
				FabricaComandoCuenta.crearComandoObtenerListaCuentaTercero(usuario);
			Cuenta[] resultado = comando.ejecutar();
			listaCuenta = Traductor.traductorListaCuenta(resultado);
			
		}catch(Exception e){
			throw new FabricaExcepcionesSoap().obtenerExcepcionSoap("Error inesperado", e);
		}
		return listaCuenta;
	}
	
	/**
	 * Se encargara de obtener la informacion de una cuenta determinada atraves del id o 
	 * el numero de cuenta y los datos del usuario
	 * @return
	 * @throws ACMSoapExcepcion 
	 */
	public CuentaWS informacioCuentaWS( CuentaWS parametro ) 
	throws ACMSoapExcepcion{
		CuentaWS resultadoFinal = new CuentaWS();
		try{
			Cuenta cuenta = Traductor.traductorCuenta(parametro);	
			ComandoInformacioCuenta comando = 
				FabricaComandoCuenta.crearComandoInformacioCuenta(cuenta);
			Cuenta resultado = comando.ejecutar();
			resultadoFinal = Traductor.traductorCuenta(resultado);
			
		}catch(Exception e){
			throw new FabricaExcepcionesSoap().obtenerExcepcionSoap("Error inesperado", e);
		}
		return resultadoFinal;
	}
	
	/**
	 * Se encarga de obtener la lista de movimientos realizado en un mes 
	 * establecido
	 * @param usuario( informacion del usuario, el mes seleccionado y la cuenta)
	 * @return
	 * @throws ACMSoapExcepcion
	 */
	public MovimientoWS[] movimientoCuentaMensualWS( ParametroWS parametro ) 
		throws ACMSoapExcepcion{
		MovimientoWS[] listaMovimiento = null;
		try{			
			Parametro parametro1 = Traductor.traductorParametro(parametro);
			
			ComandoConsultarCuentaPorMes comando = 
				FabricaComandoCuenta.crearComandoConsultarCuentaPorMes( 
						parametro1 );
			
			Movimiento[] resultado = comando.ejecutar();
			
			listaMovimiento = Traductor.traductorListaMovimiento( resultado );
		}catch(Exception e){
			throw new FabricaExcepcionesSoap().obtenerExcepcionSoap(
					"Error inesperado", e);
		}
		return listaMovimiento;
	}
	
	/**
	 * Se encarga de obtener la lista de movimientos realizado entre 2 fechas
	 * @param parametro
	 * @return una lista de movimientos
	 * @throws ACMSoapExcepcion
	 */
	public MovimientoWS[] movimientoCuentaFechaWS( ParametroWS parametro ) 
	throws ACMSoapExcepcion{
		MovimientoWS[] listaMovimiento = null;
		try{			
			Parametro parametro1 = Traductor.traductorParametro(parametro);
			
			ComandoConsultarCuentaPorFecha comando = 
				FabricaComandoCuenta.crearComandoConsultarCuentaPorFecha( parametro1 );
			
			Movimiento[] resultado = comando.ejecutar();
			
			listaMovimiento = Traductor.traductorListaMovimiento( resultado );
		}catch(Exception e){
			throw new FabricaExcepcionesSoap().obtenerExcepcionSoap("Error inesperado", e);
		}
		return listaMovimiento;
	}
	
	/**
	 * Nuevo Cliente Cliente(Nombre, cedula) y Cuenta[0](numero cuenta, Alias)
	 * @param parametro
	 * @throws ACMSoapExcepcion 
	 */
	public void ingresarNuevaCuentaMismoBancoWS( ParametroWS parametro ) 
	throws ACMSoapExcepcion{
		try{
			Parametro parametro1 = Traductor.traductorParametro(parametro);
			ComandoIngresarNuevaCuentaMismoBanco comando = 
				FabricaComandoCuenta.crearComandoIngresarNuevaCuentaMismoBanco(parametro1);
			comando.ejecutar();
			
		}catch(Exception e){
			throw new FabricaExcepcionesSoap().obtenerExcepcionSoap("Error inesperado", e);
		}
	}
	
	/**
	 * Cliente(Nombre, cedula) y Cuenta[0](numero cuenta, Alias)
	 * @param parametro: Cliente(Nombre, cedula) y Cuenta[0]
	 * (numero cuenta, Alias, banco)
	 * @throws ACMSoapExcepcion 
	 */
	public void ingresarNuevaCuentaOtroBancoWS( ParametroWS parametro ) 
	throws ACMSoapExcepcion{
		try{
			Parametro parametro1 = Traductor.traductorParametro(parametro);
			ComandoIngresarNuevaCuentaOtroBanco comando = 
				FabricaComandoCuenta.crearComandoIngresarNuevaCuentaOtroBanco(parametro1);
			comando.ejecutar();
		}catch(Exception e){
			throw new FabricaExcepcionesSoap().obtenerExcepcionSoap("Error inesperado", e);
		}
	}
}
